package cn.lizemin.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author lzm
 * @version 1.0
 * @description: TODO
 * @date 2022/1/3 16:19
 */
@Controller
@RequestMapping("file")
public class FileController {

    private static final Logger log = LoggerFactory.getLogger(FileController.class);

    @Value("${file.upload.dir}")
    private String realPath;

    /**
     * 第二种文件上传
     * 推荐使用，适用于任何一种部署方式
     * @param file
     * @return
     */
    @RequestMapping("uploadByJarDeploy")
    public String uploadByJarDeploy(MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename();
//        文件名
        log.debug("文件名：{}",file.getOriginalFilename());
        log.debug("文件大小：{}",file.getSize());
        log.debug("文件类型：{}",file.getContentType());
//        修改文件名
        String ext = originalFilename.substring(originalFilename.lastIndexOf("."));
        String newFileName = new SimpleDateFormat("yyyyMMddHHmmsssSSS").format(new Date()) + ext;

//        上传文件到哪
        file.transferTo(new File(realPath,newFileName));

        return "redirect:/upload.jsp";
    }

    /**
     * 测试文件上传 - 这种方式存在局限性，不推荐使用，因为在springboot推荐jar包部署方式的背景下，
     * 使用这种方式来上传文件会导致找不到路径报错。
     * @return
     */
    @RequestMapping("upload")
//    定义:接收文件对象 multipartFile file变量名要与form中input type="file"标签name属性名一致
    public String upload(MultipartFile file, HttpServletRequest request) throws IOException {
        String originalFilename = file.getOriginalFilename();
        log.debug("文件名：{}",file.getOriginalFilename());
        log.debug("文件大小：{}",file.getSize());
        log.debug("文件类型：{}",file.getContentType());
//        1.处理文件上传
//        根据相对路径获取绝对路径
        String realPath = request.getSession().getServletContext().getRealPath("/upload");
        log.debug("获取绝对路径：{}",realPath);

//        2.上传文件    参数1：将文件写入到那个目录
//        修改文件名
        String ext = originalFilename.substring(originalFilename.lastIndexOf("."));
        String newFileName = new SimpleDateFormat("yyyyMMddHHmmsssSSS").format(new Date()) + ext;
        file.transferTo(new File(realPath,newFileName));

        return "redirect:/upload.jsp";
    }

}
